package com.hu.system.converter;

import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import com.hu.common.utils.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.math.BigDecimal;

/**
 * 容错Boolean转换器
 * 参考原ExcelUtil的转换逻辑
 * 
 * 转换规则（与原ExcelUtil保持一致）：
 * 1. 布尔类型：直接返回
 * 2. 数字类型：非0为true，0为false
 * 3. 字符串类型："true"/"yes"/"1"为true，其他为false
 * 4. 空值：返回false（与Convert.toBool默认值一致）
 * 5. 异常情况：返回false（不抛异常）
 * 
 * @author hu-erp
 */
public class TolerantBooleanConverter implements Converter<Boolean> {
    
    private static final Logger log = LoggerFactory.getLogger(TolerantBooleanConverter.class);
    
    @Override
    public Class<Boolean> supportJavaTypeKey() {
        return Boolean.class;
    }
    
    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return null; // 支持所有Excel类型
    }
    
    /**
     * 读取Excel时的转换
     * 参考ExcelUtil.getCellValue + Convert.toBool逻辑
     */
    @Override
    public Boolean convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty,
                                     GlobalConfiguration globalConfiguration) {
        if (cellData == null) {
            return false; // 默认值false，与Convert.toBool(val, false)一致
        }
        
        try {
            Object val = "";
            
            // 第一步：根据单元格类型获取值（模拟getCellValue）
            switch (cellData.getType()) {
                case BOOLEAN:
                    // 布尔类型
                    return cellData.getBooleanValue();
                    
                case NUMBER:
                    // 数字类型：非0为true，0为false
                    BigDecimal numberValue = cellData.getNumberValue();
                    if (numberValue != null) {
                        return numberValue.compareTo(BigDecimal.ZERO) != 0;
                    }
                    break;
                    
                case STRING:
                    // 字符串类型
                    String stringValue = cellData.getStringValue();
                    if (stringValue != null) {
                        val = stringValue.trim();
                    }
                    break;
                    
                case ERROR:
                case EMPTY:
                default:
                    return false;
            }
            
            // 第二步：转换为Boolean（模拟Convert.toBool）
            if (val == null) {
                return false;
            }
            
            String strVal = val.toString().trim().toLowerCase();
            
            // 空值返回false
            if (strVal.isEmpty() || "null".equalsIgnoreCase(strVal)) {
                return false;
            }
            
            // 判断真值
            if ("true".equals(strVal) || "yes".equals(strVal) || "y".equals(strVal) || "1".equals(strVal) || "是".equals(strVal)) {
                return true;
            }
            
            // 判断假值
            if ("false".equals(strVal) || "no".equals(strVal) || "n".equals(strVal) || "0".equals(strVal) || "否".equals(strVal)) {
                return false;
            }
            
            // 其他情况返回false
            log.debug("无法明确转换 '{}' 为Boolean，返回false", strVal);
            return false;
            
        } catch (Exception e) {
            // 异常情况返回false
            log.warn("转换Boolean失败，返回false", e);
            return false;
        }
    }
    
    /**
     * 写入Excel时的转换
     */
    @Override
    public WriteCellData<?> convertToExcelData(Boolean value, ExcelContentProperty contentProperty,
                                                GlobalConfiguration globalConfiguration) {
        if (value == null) {
            return new WriteCellData<>("false");
        }
        // 转为String以确保兼容性
        return new WriteCellData<>(String.valueOf(value));
    }
}

